package com.example.shuiyin.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Map;

/**
 * 媒体文件元数据
 * 存储媒体文件的各种属性信息，如分辨率、时长、格式等
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MediaMetadata {
    
    /**
     * 媒体类型（IMAGE, VIDEO, AUDIO, DOCUMENT等）
     */
    private String mediaType;
    
    /**
     * 文件格式（如MP4, JPEG, PNG等）
     */
    private String format;
    
    /**
     * 文件名称
     */
    private String fileName;
    
    /**
     * 文件大小（字节）
     */
    private Long fileSize;
    
    /**
     * 媒体时长（毫秒），对于视频和音频文件
     */
    private Long duration;
    
    /**
     * 视频/图片宽度（像素）
     */
    private Integer width;
    
    /**
     * 视频/图片高度（像素）
     */
    private Integer height;
    
    /**
     * 比特率（bit/s），对于视频和音频文件
     */
    private Long bitrate;
    
    /**
     * 帧率，对于视频文件（fps）
     */
    private Float frameRate;
    
    /**
     * 音频采样率（Hz）
     */
    private Integer sampleRate;
    
    /**
     * 音频通道数
     */
    private Integer channels;
    
    /**
     * 创建日期/修改日期
     */
    private String creationDate;
    
    /**
     * 编码器信息
     */
    private String codec;
    
    /**
     * 其他元数据，如EXIF信息（对于图片）
     */
    private Map<String, String> additionalMetadata;
    
    /**
     * 媒体文件路径
     */
    private String filePath;
    
    /**
     * 缩略图路径，对于图片和视频
     */
    private String thumbnailPath;
    
    /**
     * 是否可转码
     */
    private Boolean canTranscode;
    
    /**
     * 是否可编辑
     */
    private Boolean canEdit;
    
    /**
     * 是否支持水印
     */
    private Boolean supportsWatermark;
    
    /**
     * 检查是否为视频文件
     */
    public boolean isVideo() {
        return "VIDEO".equalsIgnoreCase(mediaType);
    }
    
    /**
     * 检查是否为图片文件
     */
    public boolean isImage() {
        return "IMAGE".equalsIgnoreCase(mediaType);
    }
    
    /**
     * 检查是否为音频文件
     */
    public boolean isAudio() {
        return "AUDIO".equalsIgnoreCase(mediaType);
    }
    
    /**
     * 获取格式化的时长（适用于显示）
     */
    public String getFormattedDuration() {
        if (duration == null) {
            return "00:00:00";
        }
        
        long totalSeconds = duration / 1000;
        long hours = totalSeconds / 3600;
        long minutes = (totalSeconds % 3600) / 60;
        long seconds = totalSeconds % 60;
        
        return String.format("%02d:%02d:%02d", hours, minutes, seconds);
    }
    
    /**
     * 获取分辨率信息（如 "1920x1080"）
     */
    public String getResolution() {
        if (width == null || height == null) {
            return "未知";
        }
        return width + "x" + height;
    }
    
    /**
     * 获取格式化的文件大小（KB, MB, GB）
     */
    public String getFormattedFileSize() {
        if (fileSize == null) {
            return "0 B";
        }
        
        final String[] units = new String[] { "B", "KB", "MB", "GB", "TB" };
        int digitGroups = (int) (Math.log10(fileSize) / Math.log10(1024));
        
        return String.format("%.2f %s", 
                fileSize / Math.pow(1024, digitGroups), 
                units[digitGroups]);
    }
} 